<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
<link rel="stylesheet" href="../style/journal.css" type="text/css" />
<style type="text/css"><!--
.googleadsense {
	margin: 2px;
	padding: 0px;
//--></style><script src="http://www.google-analytics.com/urchin.js" type="text/javascript">
</script>
<script type="text/javascript">
_uacct = "UA-65008-1";
urchinTracker();
</script><title>ACL(access control list) 的部分实现</title>
</head>
<body>
<a href="index.html">Journal</a>(2005) | <a href="../blog/"><b>Blog</b></a>(2006) | <a href="http://www.fayland.org/cgi-bin/random_link.pl">RandomLink</a> | <a href="AboutFayland.html">WhoAmI</a> | <a href="LiveBookmark.html">LiveBookmark</a> | <a href="http://www.fayland.org/">HomePage</a>
<p><&lt;Previous: <a href="Kwiki_formatter.html">Kwiki Formatter</a>&nbsp;&nbsp;>>Next: <a href="CGI_Untaint.html">用 CGI::Untaint 检测 params</a></p>
<h1>ACL(access control list) 的部分实现</h1>
<div class='content'>
<p>Category: <a href='Modules.html'>Modules</a> &nbsp; Keywords: <b>ACL</b></p><h2>描述</h2>
<p>
很多地方我们都会运用到权限控制，比如 *nix 的文件读写，CMS 系统的文章录入审核，和 BBS 系统的斑竹，总斑竹，坛主等等。
</p>


<p>
<b>这篇文章用途不大，可看可不看。我自己都觉得可以删掉。</b>
</p>


<p>
下面讲的都是及其简单的情况下，实际的应用可能比这复杂得多。
</p>


<p>
先假设一些东西以方便我的书写：

</p>
<ul>
<li>四个人 Member1, Member2, Member3, Member4
<li>四个操作：create, edit, list, delete
<li>Member1 可以 create, edit, list, delete
<li>Member2 可以 create, edit, list
<li>Member3 可以 edit, list
<li>Member4 只能 list
</ul>
<p>

实现权限控制的方法有好多种：

</p>
<ul>
<li>一种是针对人，某人有某操作权限。数据一般写到 member 文件或 user 数据库里面
</ul>
<blockquote><pre>Member3.dat
privilege = edit,list
</pre></blockquote>
<p>
当然 privilege 可以用其他方式来表达，比如用0和1做开关来表达，privilege = 0110；或者用2的几次方来表达

</p>
<ul>
<li>另一种是针对操作，某操作可以有哪些人来执行。数据一般保存在操作文件里
</ul>
<blockquote><pre>create.dat
members = Member1,Member2
</pre></blockquote>
<p>
当 Member 变得很多时，不同 Member 可能有同样的操作权限，如此再一对一的话就会产生数据冗长。不可避免将引用 组/Group 的概念。将拥有同样权限的人划入同一组，一组对应某一类权限。
</p>


<p>
上面的假设变为：

</p>
<ul>
<li>N 个人 Member1, Member2, ... Member<code>N</code>
<li>M 个组 Group1, Group2, ... Group<code>M</code>
<li>Group1 成员有 Member1, Member7, ...
<li>...
<li>Group1 对应操作 create,list,edit,delete
<li>...
</ul>
<p>

一个没什么实际用途的代码如下：
</p>


<blockquote><pre>#Member1.dat
#groups = Group1,Group3

#create.pl
#!/usr/bin/perl
use Data::ACL;
use Set::NestedGroups;

my $user = $q-&gt;param('user'); # get the username, such as Member1
open(FH, "$user.dat");
... # get $my_groups or $user{$user}{'groups'} = 'Group1,Group3';

my $groups = Set::NestedGroups-&gt;new;
foreach (split(/\,/, $my_groups)) {
    $groups-&gt;add( $user, $_ );
}

my $acl = Data::ACL-&gt;new($groups);

my $acl_create = $acl-&gt;Realm('create');
$acl_create-&gt;Deny( 'all' );
$acl_create-&gt;Allow('Group1');
$acl_create-&gt;Allow('Group2');

my $acl_edit = $acl-&gt;Realm('edit');
$acl_edit-&gt;Deny( 'all' );
$acl_edit-&gt;Allow('Group2');

if ($acl-&gt;IsAuthorized( $user, 'create' )) {
    # do create stuff. this member can do it
} else {
    print 'Access(create) Denied!';
}

if ($acl-&gt;IsAuthorized( $user, 'edit' )) {
    # do edit stuff, this member cann't do it
} else {
    print 'Access(edit) Denied!';
}
</pre></blockquote>
<p>
真正的实际应用比这情况复杂得多。而且得考虑很多东西，比如效率，组与组之间的关系（组继承等）。打算有空举个实际例子应用下。
</p>
</div>
<p><&lt;Previous: <a href="Kwiki_formatter.html">Kwiki Formatter</a>&nbsp;&nbsp;>>Next: <a href="CGI_Untaint.html">用 CGI::Untaint 检测 params</a></p>
<p><strong>Options:</strong> <a href='http://del.icio.us/post?title=ACL(access%20control%20list)%20%E7%9A%84%E9%83%A8%E5%88%86%E5%AE%9E%E7%8E%B0&url=http://www.fayland.org/journal/ACL.html'>+Del.icio.us</a></p>
<strong>Related items</strong>
<ul><li><a href='Kwiki.html'>Kwiki 安装笔记</a> < <span class='digit'>2004-10-30 19:06:42</span> ></li><li><a href='Kwiki_formatter.html'>Kwiki Formatter</a> < <span class='digit'>2005-04-14 22:42:55</span> ></li></ul>
Created on <span class="digit">2005-04-17 20:06:36</span>, Last modified on <span class="digit">2005-05-20 23:55:25</span><br />
Copyright 2004-2005 All Rights Reserved. Powered by <a href="Eplanet.html">Eplanet</a> && <a href='http://catalyst.perl.org'>Catalyst</a> 5.62.
</body>
</html>